﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using AdmLaboratorios.DTO;
using AdmLaboratorios.Business;

namespace AdmLaboratorios
{
    public partial class frmIRAlta : Form
    {
        public PartnerDTO Partner { get; set; }
        public OrdenProduccionDTO Op { get; set; }
        public InformeRecepcionDTO Ir { get; set; }

        public DataTable items = new DataTable();

        public frmIRAlta()
        {
            InitializeComponent();
        }

        private void frmIRAlta_Load(object sender, EventArgs e)
        {
            FormsHelper.FillCombo(typeof(eInformeRecepcionTipoIngreso), cbTipoIngreso);
            cbTipoIngreso.SelectedIndex = 0;

            txOperador.Text = BusinessHelper.Usuario.UsuarioDTO.Usuario;
            txAprobador.Text = string.Empty;

            items = new DataTable();
            items.Columns.Add("IdProducto", typeof(int));
            items.Columns.Add("Producto");
            items.Columns.Add("NroAnalisis");
            items.Columns.Add("Cantidad", typeof(decimal));
            items.Columns.Add("Bultos", typeof(int));
            items.Columns.Add("Vencimiento", typeof(DateTime));
            items.Columns.Add("NroFabricacion");
            items.Columns.Add("VencimientoOrigen", typeof(DateTime));
            items.Columns.Add("Observaciones");
            items.AcceptChanges();

            FillGrid();

            grpOp.Enabled = false;
            grpItems.Enabled = false;
            btGuardar.Enabled = false;

            lbEstado.Text = eInformeRecepcionEstado.EN_REVISION.ToString();
            lbEstado.ForeColor = System.Drawing.Color.Blue;
        }

        private void btPartner_Click(object sender, EventArgs e)
        {
            using (frmPartnerConsulta f = new frmPartnerConsulta())
            {
                FormsHelper.CargarColumnasGrilla(f);
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    CleanControls();
                    this.Partner = f.Partner;
                    txPartner.Text = Partner.ToString();

                    grpOp.Enabled = true;
                    grpItems.Enabled = true;

                    FillOpByPartner();

                    btGuardar.Enabled = true;
                }
            }
        }

        private void CleanControls()
        {
            this.items.Rows.Clear();
        }

        private void FillOpByPartner()
        {
            List<OrdenProduccionDTO> ordenes = OrdenesProduccion.GetOpByPartner(Partner);

            if (ordenes.Count == 1)
            {
                Op = ordenes[0];
                LoadOP();
            }
            else
            {
                ShowSeleccionarOP();
            }
        }

        private void LoadOP()
        {
            txNumeroOP.Text = Op.ToString();
            txProducto.Text = Productos.Get(Op.IdProducto).ToString();
            var opItems = OrdenesProduccion.GetItems(Op.Id);

            //ProductoDTO producto = new ProductoDTO();
            //producto = Productos.Get(Op.IdProducto);
            //txProducto.Text = producto.Nombre;

            //List<InformeRecepcionDTO> irsByPartner = InformesRecepcion.GetIRsActiveByPartner(Partner.Id);
            var irsByPartner = InformesRecepcion.GetByOP(Op, eInformeRecepcionEstado.APROBADO);
            List<InformeRecepcionItemDTO> irItems = new List<InformeRecepcionItemDTO>();

            foreach (InformeRecepcionDTO ir in irsByPartner)
                irItems.AddRange(InformesRecepcion.GetItemsByIR(ir.Id));

            var totales = (from aux in irItems
                          group aux by aux.IdProducto into g
                          select new 
                          { 
                              IdProducto = g.Key, 
                              CantTotal = g.Sum(x => x.Cantidad) 
                          }).ToList();


            decimal cantidad;
            foreach (OrdenProduccionItemDTO opItem in opItems)
            {
                cantidad = 0;

                var element = totales.Find(x => x.IdProducto == opItem.IdProducto);
                if (element != null)
                    cantidad = element.CantTotal;

                items.Rows.Add(
                    opItem.IdProducto,
                    Productos.Get(opItem.IdProducto).Nombre,
                    "",
                    opItem.Cantidad > cantidad ? opItem.Cantidad - cantidad : 0,
                    1,
                    null,
                    "",
                    null,
                    "");


                //cantidad = 0;
                //foreach (InformeRecepcionItemDTO irItem in irItems)
                //{
                //    if (irItem.IdProducto == opItem.IdProducto)
                //        cantidad += irItem.Cantidad;
                //}

                //items.Rows.Add(opItem.IdProducto,
                //    Productos.Get(opItem.IdProducto).Nombre,
                //    "",
                //    opItem.Cantidad - cantidad,
                //    1,
                //    null,
                //    "",
                //    null,
                //    "");
            }
            lbItemsCount.Text = items.Rows.Count.ToString();
        }

        private void FillGrid()
        {
            gvItems.DataSource = null;
            gvItems.DataSource = items;
            lbItemsCount.Text = items.Rows.Count.ToString();
        }

        //private void btAprobar_Click(object sender, EventArgs e)
        //{
        //    if (Ir != null && Ir.Id != 0)
        //    {
        //        try
        //        {
        //            Ir = InformesRecepcion.ApproveIR(Ir);
                    
        //            MessageBox.Show("El Informe de Recepción ha sido Aprobada",
        //            "Informe de Recepción Aprobada", MessageBoxButtons.OK, MessageBoxIcon.Information);

        //            lbEstado.Text = eInformeRecepcionEstado.APROBADO.ToString(); // "Aprobada";
                
        //        }
        //        catch (Exception ex)
        //        {
        //            FormsHelper.MsgErrorInesperado(ex);
        //        }
        //    }
        //}

        private void btOp_Click(object sender, EventArgs e)
        {
            ShowSeleccionarOP();
        }

        private void ShowSeleccionarOP()
        {
            using (frmOPSeleccion f = new frmOPSeleccion())
            {
                f.Partner = this.Partner;
                FormsHelper.CargarColumnasGrilla(f);
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    Op = f.OP;
                    LoadOP();
                }
            }
        }

        private void btRemove_Click(object sender, EventArgs e)
        {
            if (gvItems.SelectedRows.Count == 1)
            {
                if (MessageBox.Show("¿Está seguro de que desea quitar el item seleccionado?",
                    "Quitar Item", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
                {
                    items.Rows.Remove(
                        ((DataRowView)gvItems.SelectedRows[0].DataBoundItem).Row);
                    lbItemsCount.Text = gvItems.RowCount.ToString();
                }
            }
        }

        private void btEdit_Click(object sender, EventArgs e)
        {
            if (gvItems.SelectedRows.Count == 1)
            {
                using (frmIRItem f = new frmIRItem())
                {
                    InformeRecepcionItemDTO irItem = new InformeRecepcionItemDTO();

                    irItem.IdProducto = (int)gvItems.SelectedRows[0].Cells["IdProducto"].Value;
                    irItem.NroAnalisis = (string)gvItems.SelectedRows[0].Cells["NroAnalisis"].Value;
                    irItem.Cantidad = (decimal)gvItems.SelectedRows[0].Cells["Cantidad"].Value;
                    irItem.Bultos = (int)gvItems.SelectedRows[0].Cells["Bultos"].Value;
                    //irItem.Vencimiento = DBNull is gvItems.SelectedRows[0].Cells["Vencimiento"].Value ? null : (string)gvItems.SelectedRows[0].Cells["Vencimiento"].Value;

                    if (!(gvItems.SelectedRows[0].Cells["Vencimiento"].Value is DBNull))
                        irItem.Vencimiento = DateTime.Parse(Convert.ToString(gvItems.SelectedRows[0].Cells["Vencimiento"].Value));
                    else
                        irItem.Vencimiento = DateTime.MinValue;

                    //irItem.Vencimiento = DateTime.TryParse((string)gvItems.SelectedRows[0].Cells["Vencimiento"].Value, out aux) ? aux : DateTime.MinValue;
                    irItem.NroFabricacion = (string)gvItems.SelectedRows[0].Cells["NroFabricacion"].Value;
                    if (!(gvItems.SelectedRows[0].Cells["VencimientoOrigen"].Value is DBNull))
                    {
                        irItem.VencimientoOrigen = DateTime.Parse(Convert.ToString(gvItems.SelectedRows[0].Cells["VencimientoOrigen"].Value));
                    }
                    else
                        irItem.VencimientoOrigen = DateTime.MinValue;
                    //irItem.VencimientoOrigen = DateTime.TryParse((string)gvItems.SelectedRows[0].Cells["VencimientoOrigen"].Value, out aux) ? aux : DateTime.MinValue;
                    irItem.Obs = (string)gvItems.SelectedRows[0].Cells["Observaciones"].Value;


                    f.Item = irItem;

                    f.Producto = Productos.Get((int)gvItems.SelectedRows[0].Cells["IdProducto"].Value);

                    FormsHelper.CargarColumnasGrilla(f);
                    if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                    {
                        gvItems.SelectedRows[0].Cells["IdProducto"].Value = f.Item.IdProducto;
                        gvItems.SelectedRows[0].Cells["Producto"].Value = f.Producto.Nombre;
                        gvItems.SelectedRows[0].Cells["NroAnalisis"].Value = f.Item.NroAnalisis;
                        gvItems.SelectedRows[0].Cells["Cantidad"].Value = f.Item.Cantidad;
                        gvItems.SelectedRows[0].Cells["Bultos"].Value = f.Item.Bultos;
                        gvItems.SelectedRows[0].Cells["Vencimiento"].Value = f.Item.Vencimiento;
                        gvItems.SelectedRows[0].Cells["NroFabricacion"].Value = f.Item.NroFabricacion;
                        gvItems.SelectedRows[0].Cells["VencimientoOrigen"].Value = f.Item.VencimientoOrigen;
                        gvItems.SelectedRows[0].Cells["Observaciones"].Value = f.Item.Obs;
                    }
                }
            }
        }

        private void btAdd_Click(object sender, EventArgs e)
        {
            using (frmIRItem f = new frmIRItem())
            {
                if (this.Partner != null)
                    f.Partner = this.Partner;

                FormsHelper.CargarColumnasGrilla(f);
                if (f.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {  
                    items.Rows.Add(f.Item.IdProducto,
                        f.Producto.Nombre,
                        f.Item.NroAnalisis,
                        f.Item.Cantidad,
                        f.Item.Bultos,
                        f.Item.Vencimiento,
                        f.Item.NroFabricacion,
                        f.Item.VencimientoOrigen,
                        f.Item.Obs);
                    lbItemsCount.Text = gvItems.RowCount.ToString();
                }
            }
        }

        private void btCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                IR ir = new IR();
                ir.InformeRecepcion = FillIR();
                ir.Items = FillItems();

                ir = InformesRecepcion.Save(ir);

                FormsHelper.MsgGuardadoOk();
                this.Close();
            }
            catch (Exception ex)
            {
                FormsHelper.MsgErrorInesperado(ex);
            }
        }

        private InformeRecepcionDTO FillIR()
        {
            InformeRecepcionDTO ir = new InformeRecepcionDTO();

            ir.Activo = true;
            ir.Estado = eInformeRecepcionEstado.EN_REVISION.ToString();
            ir.Fecha = dt.Value;
            if (Op != null)
                ir.IdOrdenProduccion = Op.Id;
            else
                ir.IdOrdenProduccion = null;

            if (Partner != null)
                ir.IdPartner = Partner.Id;
            else
                throw new Exception("You have to select a Partner");
            //if (Partner != null)
            //    ir.IdPartner = Partner.Id;
            //else
            //    ir.IdPartner = null;
            
            //
            if (txLetra.Text != string.Empty)
                ir.Letra = txLetra.Text.Substring(0,1);
            else
                ir.Letra = " ";

            ir.Numero = Convert.ToInt32(nuNumero.Value);
            ir.PtoVta = Convert.ToInt32(nuPtoVta.Value);
            ir.NroComprobante = string.Format("{0}{1}{2}", ir.Letra, ir.PtoVta, ir.Numero);
            //

            ir.IdOperador = BusinessHelper.Usuario.UsuarioDTO.Id;
            ir.IdAprobador = null;
            ir.Obs = txObs.Text;
            ir.ObsImpresion = txObsImpresion.Text;
            ir.RemitoPartner = txRemitoPartner.Text.Trim();

            ir.TipoIngreso = cbTipoIngreso.Text;
            ir.ArchivoPDF = null;

            return ir;
        }

        private List<InformeRecepcionItemDTO> FillItems()
        {
            List<InformeRecepcionItemDTO> itemsList = new List<InformeRecepcionItemDTO>();

            int idx = 0;
            foreach (DataRow row in items.Rows)
            {
                InformeRecepcionItemDTO item = new InformeRecepcionItemDTO();

                item.Activo = true;

                item.Bultos = (int)row["Bultos"];
                item.Cantidad = (decimal)row["Cantidad"];
                item.IdProducto = (int)row["IdProducto"];

                item.NroAnalisis = (string)row["NroAnalisis"];
                item.NroFabricacion = (string)row["NroFabricacion"];
                item.Obs = (string)row["Observaciones"];

                item.Vencimiento = row["Vencimiento"] is DBNull ? DateTime.MinValue :
                    (DateTime)row["Vencimiento"];

                item.VencimientoOrigen = row["VencimientoOrigen"] is DBNull ? DateTime.MinValue :
                    (DateTime)row["VencimientoOrigen"];
                
                item.IdStock = null;

                idx++;
                itemsList.Add(item);
            }

            return itemsList;
        }

        private void picPartnerDetalle_Click(object sender, EventArgs e)
        {
            if (this.Partner != null)
            {
                using (frmPartnerDetalle f = new frmPartnerDetalle())
                {
                    f.Partner = this.Partner;
                    FormsHelper.CargarColumnasGrilla(f);
                    f.ShowDialog();
                }
            }
            else
            {
                MessageBox.Show("Debe seleccionar un Partner para poder ver su detalle.",
                    "Detalle de Partner", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        internal void SetValues(int idIR)
        {

        }

        private void btOpLimpiar_Click(object sender, EventArgs e)
        {
            txNumeroOP.Text = string.Empty;
            txProducto.Text = string.Empty;
            Op = null;
        }
    }
}
